#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
+#include <linux/memfd.h>
#include <sys/mman.h>
+#include <sys/syscall.h>
#include <glib.h>
#include "gdkwayland.h"
size_t *buf_length,
void **data_out)
{
- char *filename;
struct wl_shm_pool *pool;
- int fd;
+ int ret, fd;
void *data;
- filename = g_strconcat (g_get_tmp_dir (), G_DIR_SEPARATOR_S, "wayland-shm-XXXXXX", NULL);
- fd = mkstemp (filename);
- if (fd < 0)
+ ret = syscall (SYS_memfd_create, "gdk-wayland", MFD_CLOEXEC);
+
+ if (ret < 0)
{
- g_critical (G_STRLOC ": Unable to create temporary file (%s): %s",
- filename, g_strerror (errno));
- g_free (filename);
+ g_critical (G_STRLOC ": creating shared memory file failed: %s",
+ g_strerror (-ret));
return NULL;
}
- unlink (filename);
+
+ fd = ret;
if (ftruncate (fd, size) < 0)
{
- g_critical (G_STRLOC ": Truncating temporary file (%s) failed: %s",
- filename, g_strerror (errno));
- g_free (filename);
+ g_critical (G_STRLOC ": Truncating shared memory file failed: %m");
close (fd);
return NULL;
}
if (data == MAP_FAILED)
{
- g_critical (G_STRLOC ": mmap'ping temporary file (%s) failed: %s",
- filename, g_strerror (errno));
- g_free (filename);
+ g_critical (G_STRLOC ": mmap'ping shared memory file failed: %m");
close (fd);
return NULL;
}
pool = wl_shm_create_pool (shm, fd, size);
close (fd);
- g_free (filename);
*data_out = data;
*buf_length = size;